import { getLoginUid, responseJson } from "~/server/utils/helper";
import COS from "cos-nodejs-sdk-v5";
import { randomUUID } from "crypto";

export default defineEventHandler(async (event) => {
  //判断用户登录
  let uid = getLoginUid(event);
  if (uid === 0) {
    setResponseStatus(event, 401);
    return responseJson(1, "请先登录", {});
  }

  //获取数据
  const body = await readMultipartFormData(event);

  if (body && body.length > 0) {
    // 验证文件类型，兼容 TypeScript 类型定义
    const allowedTypes = ["image/jpeg", "image/png", "image/jpg", "image/gif", "image/webp"];
    const fileType = typeof body[0].type === "string" ? body[0].type : "";
    if (!allowedTypes.includes(fileType)) {
      return responseJson(1, "请上传图片文件（jpg/png/gif/webp）", {});
    }
    const config = useRuntimeConfig();
    
    // 检查配置是否被交换（SecretKey 以 AKID 开头说明配置错误）
    if (config.SecretKey && config.SecretKey.startsWith('AKID') && !config.SecretId.startsWith('AKID')) {
      console.error("配置错误: SECRET_ID 和 SECRET_KEY 的值可能被交换了，请检查 .env.local 文件");
      setResponseStatus(event, 500);
      return responseJson(1, "配置错误：SECRET_ID 和 SECRET_KEY 的值可能被交换了，请检查 .env.local 文件", {});
    }
    
    // 验证配置是否存在
    if (!config.SecretId || !config.SecretKey) {
      console.error("COS 配置缺失:", {
        hasSecretId: !!config.SecretId,
        hasSecretKey: !!config.SecretKey,
      });
      setResponseStatus(event, 500);
      return responseJson(1, "服务器配置错误，请联系管理员", {});
    }

    if (!config.public?.BUCKET || !config.public?.REGION) {
      console.error("COS Bucket 配置缺失:", {
        hasBucket: !!config.public?.BUCKET,
        hasRegion: !!config.public?.REGION,
      });
      setResponseStatus(event, 500);
      return responseJson(1, "服务器配置错误，请联系管理员", {});
    }

    try {
      // 去除可能的空白字符
      const cleanSecretId = config.SecretId.trim();
      const cleanSecretKey = config.SecretKey.trim();
      
      const cos = new COS({
        SecretId: cleanSecretId,
        SecretKey: cleanSecretKey,
      });

      //图片名称
      const fileName = body[0].filename || "image";
      //图片数据
      const buffer = body[0].data;
      // 获取文件扩展名（去掉点）
      const ext = fileName.slice(fileName.lastIndexOf(".") + 1).toLowerCase();
      // key（使用 randomUUID 生成唯一文件名，确保没有多余的点）
      let key = `uploads/${uid}/note/${randomUUID()}.${ext}`;
      
      // 请求文件
      const data = await cos.putObject({
        Bucket: config.public.BUCKET /* 必须 */,
        Region: config.public.REGION /* 必须 */,
        Key: key /* 必须 */,
        Body: buffer,
      });
      
      if (!data || !data.Location) {
        console.error("COS 上传失败：未返回 Location");
        setResponseStatus(event, 500);
        return responseJson(1, "上传失败，请稍后重试", {});
      }
      
      // Location 格式可能是 "bucket-name.cos.region.myqcloud.com/key" 或直接是域名
      const imageUrl = data.Location.startsWith('http') 
        ? data.Location 
        : `https://${data.Location}`;

      return responseJson(0, "上传成功", {
        url: imageUrl,
      });
    } catch (cosError: any) {
      // COS SDK 错误处理
      console.error("COS 上传失败:", cosError?.message || cosError?.error?.Message || "未知错误");
      
      // 如果是因为密钥格式错误
      const errorMessage = cosError?.message || cosError?.error?.Message || "未知错误";
      if (errorMessage.includes("access key Id format") || errorMessage.includes("SecretId")) {
        console.error("提示：请检查 .env.local 文件中的 SECRET_ID 和 SECRET_KEY 配置是否正确");
        setResponseStatus(event, 500);
        return responseJson(1, "服务器配置错误，请联系管理员", {});
      }
      
      setResponseStatus(event, 500);
      return responseJson(1, `上传失败: ${errorMessage}`, {});
    }
  }

  return responseJson(1, "请上传图片文件", {});
});

